package com.until.server;


import com.until.response.AbsResponseBody;
import org.springframework.http.HttpMethod;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @implNote  定义自定义 service 的处理器,定义的模型的 service层 代码需继承于本类的方法
 * @param <ExampleType> 传递的sql的统一数据类型
 * @param <ActionType> 执行动作的统一数据类型
 * @param <ModelType> 传递的对象的模型类型
 * @author AdminUser
 */
public abstract class BaseService<ModelType,ExampleType,ActionType> extends ServiceSqlUntil<ModelType,ExampleType,ActionType> {
    /**
     * Map<ActionType, GetServerSqlUntil<ModelType, ExampleType>> 为要查找的 mapper 字典
     */
    protected Map<HttpMethod, MethodExamples<ModelType, ExampleType, ActionType>> mapper= new HashMap<>();

    {
        mapper.put(HttpMethod.GET,this.getMap);
        mapper.put(HttpMethod.POST, this.postMap);
        mapper.put(HttpMethod.PUT,this.putMap);
        mapper.put(HttpMethod.DELETE,this.deleteMap);
    }

    /**
     * 定义自定义sql查询方法实现抽象方法的调用得到 sql 语句的方法
     * return selectByExample(userInfoExample);
     * @param model 传递的模型的数据
     * @param action 传递的动作
     * @return 返回查询结果
     */
    protected ExampleType getExtension(ModelType model, ActionType action,HttpMethod method) throws Exception{
        MethodExamples<ModelType, ExampleType, ActionType> getAction = mapper.get(method);
        GetServerSqlUntil<ModelType, ExampleType> userInfo = getAction.getExamples(action);
        if (userInfo != null) {
            return userInfo.selectByModelExample(model);
        }else{
            throw new Exception(AbsResponseBody.NULL_POINTER_EXCEPTION.getMessage());
        }
    }

    /**
     * 定义自定义sql查询方法实现抽象方法,需要去实现这个方法，调用方式<br/>
     * GetServerSqlUntil<UserInfo, UserInfoExample> userInfo =this.getExamples(action);<br/>
     * UserInfoExample userInfoExample=userInfo != null?userInfo.selectByModelExample(model):null;<br/>
     * return selectByExample(userInfoExample);
     * @param model 传递的模型的数据
     * @param action 传递的动作
     * @return 返回查询结果
     */
    public abstract List<ModelType> coreSelection(ModelType model, ActionType action,HttpMethod method) throws Exception;

}
